#include <stdio.h>
#include <stdlib.h>

#include "set.h"

int test_lnk__empty()
{
    struct link lnk = lnk__empty();
    return lnk.head == NULL;
}
int test_lnk__is_end()
{
  struct link l = lnk__empty();
  struct lelement e;
  lnk__add_head(&l,&e);

  if(lnk__is_end(&l,l.head))
    return 0;

  return lnk__is_end(&l,l.head->next);
}
int test_lnk__add_head()
{
  struct link l = lnk__empty();
  struct lelement * pool = malloc(100*sizeof(struct lelement));

  int i;
  for(i=0; i<100; i++)
    lnk__add_head(&l,pool+i);

  struct lelement * c = l.head;
  for(i=0; i<110 && !lnk__is_end(&l,c); i++)
    c = c->next;

  free(pool);
  return i==100;

  /*struct link l = lnk__empty();
  struct lelement e;
  lnk__add_head(&l,&e);

  return (l.head == &e) && (lnk__is_end(&l,l.head->next));*/

}
int test_lnk__remove_head()
{
  struct link l = lnk__empty();
  struct lelement e;
  lnk__add_head(&l,&e);
  lnk__remove_head(&l);

  return lnk__is_end(&l,l.head);
}

int test_lnk__add_tail()
{
  struct link l = lnk__empty();
  struct lelement e;
  lnk__add_head(&l,&e);

  struct lelement e3;
  lnk__add_tail(&l,&e3);

  return l.head->next == &e3 && test_lnk__is_end(e3.next);
}

int test_lnk__remove_after()
{
  struct link l = lnk__empty();
  struct lelement e;
  lnk__add_head(&l,&e);
  lnk__remove_after(&l,NULL);

  if(! lnk__is_end(&l,l.head) )
    return 0;

  lnk__add_head(&l,&e);
  struct lelement e2;
  lnk__add_head(&l,&e2);

  lnk__remove_after(&l, &e2);

  return (l.head == &e2) && lnk__is_end(&l,l.head->next);
}

int main()
{
    printf("lnk__empty?\t\t%d\n",test_lnk__empty());
    printf("lnk__is_end?\t\t%d\n",test_lnk__is_end());
    printf("lnk__add_head?\t\t%d\n",test_lnk__add_head());
    printf("lnk__remove_head?\t%d\n",test_lnk__remove_head());
    printf("lnk__add_tail?\t\t%d\n",test_lnk__add_tail());
    printf("lnk__remove_after?\t%d\n",test_lnk__remove_after());

  return EXIT_SUCCESS;
}

